/* 
 * File:   Conexion.h
 * Author: Maximiliano Monzon
 *
 * Created on October 18, 2012, 7:00 PM
 */

#ifndef CONEXION_H
#define	CONEXION_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <string>
#include <vector>
#include "common_Thread.h"
#include "common_Excepcion.h"
#include "server_IManejadorConexionEvento.h"
#include "server_IEnviante.h"
#include "server_Sesion.h"
#include "server_SockStream.h"
#include "server_SockStreamAsincronico.h"


using namespace std;
using namespace TP;
using namespace TP::Threading;
using namespace TP::Comunicacion;
using namespace TP::Comunicacion::Asincronica;
using namespace TP::Comunicacion::Eventos;

namespace TP { namespace Comunicacion {

    class Conexion : Thread::Thread, public IEnviante {
    
    public:
        
        Conexion(const string& pPuerto, IManejadorConexionEvento* pManejador);
        
        virtual ~Conexion();

        void Iniciar() throw (Excepcion&);
        
        void Finalizar() throw (Excepcion&);        
        
    protected:
        virtual void tarea ();
        
    private:
        
        void descripcionErrorConexion (string &pMensaje, int pCodigoError);
        
        string _puerto;
        struct sockaddr_in serv_addr;
        
        SockStreamAsincronico* _socket;
        
        IManejadorConexionEvento* manejadorConexionEvento;
        bool conexionFinalizada
           , errorConexion;
        

    };

}}

#endif	/* CONEXION_H */

